
package IO;

import java.io.*;
import java.util.Scanner;

public class IODemo7 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //1.先让用户指定一个根目录
        System.out.println("请输入要扫描的根目录：");
        File rootDir = new File(scanner.next());
        if (!rootDir.isDirectory()) {//判断字符串是否是目录
            System.out.println("输入有误，您输入的根目录不存在!");
            return;
        }
        //2.让用户输入一个要查询的字符串
        System.out.println("请输入要查询的词：");
        String word = scanner.next();

        //3. 递归的进行目录/文件的遍历
        scanDir(rootDir,word);
    }

    private static void scanDir(File rootDir, String word) {
        //列出当前rootDir（目录）中的内容，没有内容直接结束
        File[] files = rootDir.listFiles();//用一个file类型的数组来接收
        if (files == null) { //这几行代码就是处理根节点
            //如果当前是一个空的目录（文件夹为空），就结束递归即可
            //没必要再进行递归了
            return;
        }
        //目录中有内容，就遍历目录中的每个元素
        for (File f : files) {//此处的处理子树是循环处理的，因为目录是一个N叉树，不只是左边和右边
            if (f.isFile()) {
                //是普通文件
                //打开文件，读取内容，比较看是否包含要查找的字符串
                String content = readFile(f);
                if (content.contains(word)) {
                    System.out.println(f.getAbsolutePath() + "包含要查找的关键字！");
                }
            }else if (f.isDirectory()) {
                //是目录文件
                //进行递归操作
                scanDir(f,word);
                //此处的递归操作就是以f为起点再次遍历去搜索里面的内容
            }else {
                //既不是普通文件又不是目录文件，就跳过即可
                continue;
            }
        }

    }

    private static String readFile(File f) {
        //读取文件的整个内容  然后返回这个内容
        //使用字符流来读取，因为要查找的是字符串
        StringBuilder stringBuilder = new StringBuilder();
        try (Reader reader = new FileReader(f)) {//这行代码就是打开文件的意思
            //一次读取一个字符，把读到的结果拼装到StringBuilder里面 再转化成STring
            while (true) {
                int c = reader.read();
                if (c == -1) {
                    break;
                }
                stringBuilder.append((char) c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}
